#include <my_header.h>

/* Usage:  */
int main(int argc, char *argv[]){   
    // 1.生产标识
    key_t keytag = ftok("./4_shmdt", 100);
    ERROR_CHECK(keytag, -1, "ftok");
    printf("key_t :%d\n", keytag);

    //2. 创建共享内存 shmid:共享内存标识
    int shmid = shmget(keytag, 4096, 0666 | IPC_CREAT);
    ERROR_CHECK(shmid, -1, "shmid");
    printf("shmid :%d\n",shmid);

    // 3. 获取共享内存
    char *p = (char *)shmat(shmid, NULL, 0);
    ERROR_CHECK(p, NULL, "shmat");
   
    // 往共享内存中写内容
    strcpy(p, "write");
    shmdt(p);   // 接触共享内存映射
    
    while(1)    // 已经接触共享内存映射
    {
        strcpy(p, "not");   // 写不进去
    }

    return 0;
}

#if 0

使用 shmdt函数可以断开当前进程与共享内存段的连接，解除到共
享内存段的映射(某种程度上等价于free)。(当一个进程通过shmgt函
数将共享内存段附加到自己的地址空间后，使用shmdt函数将其分
离。)(man 2 shmdt

#include <sys/types.h>
#include <sys/shm.h>
//shared memory operations
int shmdt(
const void *shmaddr // 指向共享内存段的起始地址(shmat
返回值)
);
//返回值:成功0，失败-1
#endif
